package br.org.acessobrasil.portal.persistencia;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import br.org.acessobrasil.portal.modelo.Conteudo;
import br.org.acessobrasil.portal.modelo.ItemConteudo;
import br.org.acessobrasil.portal.modelo.Setor;
import br.org.acessobrasil.portal.modelo.Sitio;

public class ConteudoDaoSpring extends SuperDao<Conteudo>{
	private static Logger logger = Logger.getLogger(ConteudoDaoSpring.class);
	private TipoConteudoDaoSpring tipoConteudoDao;
	private static ConteudoDaoSpring instance;
	
	public TipoConteudoDaoSpring getTipoConteudoDao() {
		return tipoConteudoDao;
	}
	
	public void setTipoConteudoDao(TipoConteudoDaoSpring tipoConteudoDao) {
		this.tipoConteudoDao = tipoConteudoDao;
	}
	
	public ConteudoDaoSpring() {
		logger.info("ConteudoDao instanciado");
		instance = this;
	}
	
	
	/**
	 * Apaga todos os iten_conteudo deste conteudo
	 * 
	 * @param id nu_conteudo
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws ClassNotFoundException
	 * @throws SQLException
	 */
	public void apagar(long id) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
		Conteudo conteudo = select(id);
		//remover ele dos setores
		List<Setor> setores = getEntityManager().createQuery("Select o From " + Setor.class.getName() + " o").getResultList();
		for(Setor setor:setores){
			setor.getListConteudo().remove(conteudo);
		}
		getEntityManager().remove(conteudo);
	}

	/**
	 * Seleciona todos que n&atilde;o est&atilde;o nesta lista de conteudos
	 * @param setor
	 * @return lista de n&atilde;o incluidos na lista conteudos
	 */
	@SuppressWarnings("unchecked")
	public List<Conteudo> getListNE(List<Conteudo> conteudos) {
		String sql="Select c From Conteudo c where c.nu_conteudo not in (0";
		for(int i=0;i<conteudos.size();i++)
			sql+=","+conteudos.get(i).getNuConteudo();
		sql+=") order by c.no_conteudo";
		return getEntityManager().createQuery(sql).getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<Conteudo> getListaTodos(Sitio sitio) {
		return getEntityManager().createQuery("Select c From Conteudo c where c.sitio = ? order by c.no_conteudo").setParameter(1, sitio).getResultList();
	}
		
	public Conteudo select(Long nu_conteudo) {
		return getEntityManager().find(Conteudo.class,nu_conteudo);
	}

	public <R> R find(Class<R> entityClass,Object primaryKey){
	
		return getEntityManager().find(entityClass,primaryKey);
	}
	public void create(Conteudo conteudo) {
		getEntityManager().persist(conteudo);
	}

	public void update(Conteudo conteudo) {
		getEntityManager().merge(conteudo);		
	}

	public static ConteudoDaoSpring getInstance() {
		return instance;
	}

	@SuppressWarnings("unchecked")
	public List<Conteudo> getListaPermitidoSetor(Setor setor) {
		List obj = getEntityManager().createQuery("Select s.listConteudo From Setor s where s.nu_setor=:idSetor")
				.setParameter("idSetor", setor.getNuSetor())
				.getResultList();		
		return obj;
	}

	public List<ItemConteudo> listarItemConteudo(Conteudo conteudo, int ini, int max, boolean todosStatus) {
		List<Conteudo> conteudos = new ArrayList<Conteudo>();
		conteudos.add(conteudo);
		return listarItemConteudo(conteudos, ini, max, todosStatus);
	}

	
	public List<ItemConteudo> listarItemConteudo(List<Conteudo> conteudos, int ini, int max, boolean todosStatus) {
		String orderBy = ""; 
		String orderBy2 = "";
		Conteudo conteudo = conteudos.get(0);
		if(Conteudo.ORDENAR_POR_TITULO.equals(conteudo.getNuTipoOrdenacao())){
			orderBy="o.no_titulo asc";
		}else if(Conteudo.ORDENAR_POR_ID.equals(conteudo.getNuTipoOrdenacao())){
			orderBy="o.nu_item_conteudo";	
		}else if(Conteudo.ORDENAR_MANUAL.equals(conteudo.getNuTipoOrdenacao())){
			orderBy="o.nu_ordem";
		}else if(Conteudo.ORDENAR_POR_DATA_PUBLICACAO.equals(null)){
			orderBy="o.dt_para_publicacao";	
			orderBy2 = ", o.nu_item_conteudo asc";
		}else{
			//Default if(Conteudo.ORDENAR_POR_DATA_PUBLICACAO.equals(conteudo.getNuTipoOrdenacao())
			orderBy="o.dt_para_publicacao";	
			orderBy2 = ", o.nu_item_conteudo asc";
		}
		if(conteudo.isCoOrdemDecrescente()){
			orderBy+=" desc";	
		}else{
			orderBy+=" asc";
		}
		String qPublicado="";
		if(!todosStatus){
			qPublicado=" and o.st_situacao='p' ";
		}
		String sqlConteudos="1=0";
		for(Conteudo c:conteudos){
			sqlConteudos +=" or o.nu_conteudo="+c.getNuConteudo(); 
		}
		String query = "Select o From " + ItemConteudo.class.getName() + " o where ("+sqlConteudos+") "+qPublicado+" order by "+orderBy + orderBy2;
		logger.debug(query);
		
		List<ItemConteudo> retorno = getEntityManager().createQuery(query)
			.setFirstResult(ini)
			.setMaxResults(max)
			.getResultList();
		return retorno;
	}


}
